/******************************************************************************
 * @Filename     : gpio.h
 *
 * @Version      : V1.0
 * @Subversion   : $
 * @Last modified: 04/07/2020 16:01:41
 * @Modified by  : Mxy
 *
 * @Brief        : GPIO driver header file
 *
 * Copyright (C) 2020 SKYRELAY Technology co.,Ltd All rights reserved.
 *****************************************************************************/
#ifndef __RC2412_GPIO_H__
#define __RC2412_GPIO_H__

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdint.h>
#include "../../periph_def/rc2412_gpio_def.h"

////////////////////////////////////////////////////////////////////////////////////////
// @brief       Clear GPIO Pin Interrupt Flag                                         //
//                                                                                    //
// @param[in]   gpio        GPIO port. It could be GPIO0, GPIO1                       //
// @param[in]   u32PinMask  The single or multiple pins of specified GPIO port        //
//                                                                                    //
// @return      None                                                                  //
//                                                                                    //
// @details     Clear the interrupt status of specified GPIO pin.                     //
////////////////////////////////////////////////////////////////////////////////////////
#define GPIO_CLR_INT_FLAG(gpio, u32PinMask)         ((gpio)->INTSTR = u32PinMask)


////////////////////////////////////////////////////////////////////////////////////////
// @brief       Disable I/O DOUT mask                                                 //
//                                                                                    //
// @param[in]   gpio        GPIO port. It could be GPIO0, GPIO1                       //
// @param[in]   u32PinMask  The single or multiple pins of specified GPIO port        //
//                                                                                    //
// @return      None                                                                  //
//                                                                                    //
// @details     Disable I/O DOUT mask of specified GPIO pin.                          //
////////////////////////////////////////////////////////////////////////////////////////
#define GPIO_DISABLE_DOUT_Msk(gpio, u32PinMask)    ((gpio)->DOUTMASK &= ~u32PinMask)

////////////////////////////////////////////////////////////////////////////////////////
// @brief       Enable I/O DOUT mask                                                  //
//                                                                                    //
// @param[in]   gpio        GPIO port. It could be GPIO0, GPIO1                       //
// @param[in]   u32PinMask  The single or multiple pins of specified GPIO port        //
//                                                                                    //
// @return      None                                                                  //
//                                                                                    //
// @details     Enable I/O DOUT mask of specified GPIO pin.                           //
////////////////////////////////////////////////////////////////////////////////////////
#define GPIO_ENABLE_DOUT_Msk(gpio, u32PinMask)     ((gpio)->DOUTMASK |= u32PinMask)

////////////////////////////////////////////////////////////////////////////////////////
// @brief       Get GPIO Pin Interrupt Flag                                           //
//                                                                                    //
// @param[in]   gpio        GPIO port. It could be GPIO0, GPIO1                       //
// @param[in]   u32PinMask  The single or multiple pins of specified GPIO port        //
//                                                                                    //
// @retval      0           No interrupt at specified GPIO pin                        //
// @retval      1           The specified GPIO pin generate an interrupt              //
//                                                                                    //
// @details     Get the interrupt status of specified GPIO pin.                       //
////////////////////////////////////////////////////////////////////////////////////////
#define GPIO_GET_INT_FLAG(gpio, u32PinMask)         ((gpio)->INTSTR & u32PinMask)

////////////////////////////////////////////////////////////////////////////////////////
// @brief       Get GPIO Port IN Data                                                 //
//                                                                                    //
// @param[in]   gpio GPIO port. It could be GPIO0, GPIO1                              //
//                                                                                    //
// @retval      The specified port data                                               //
//                                                                                    //
// @details     Get the PIN register of specified GPIO port.                          //
////////////////////////////////////////////////////////////////////////////////////////
#define GPIO_GET_IN_DATA(gpio)   ((gpio)->PIN)
#define GPIO_GET_IN_BIT(gpio, u32Pin)		(((gpio)->PIN & u32Pin) != 0 ? 1 : 0)

////////////////////////////////////////////////////////////////////////////////////////
// @brief       Set GPIO Port OUT Data                                                //
//                                                                                    //
// @param[in]   gpio        GPIO port. It could be GPIO0, GPIO1                       //
// @param[in]   u32Data     GPIO port data                                            //
//                                                                                    //
// @retval      None                                                                  //
//                                                                                    //
// @details     Set the Data into specified GPIO port.                                //
////////////////////////////////////////////////////////////////////////////////////////
#define GPIO_SET_OUT_DATA(gpio, u32Data)   ((gpio)->DOUT = (u32Data))

////////////////////////////////////////////////////////////////////////////////////////
// @brief       Toggle Specified GPIO pin                                             //
//                                                                                    //
// @param[in]   u32Pin  GPIOx_y x is {0,1}, y is {0,1,...,31}                         //
//                                                                                    //
// @retval      None                                                                  //
//                                                                                    //
// @details     Toggle the specified GPIO pint.                                       //
////////////////////////////////////////////////////////////////////////////////////////
#define GPIO_TOGGLE(u32Pin)   ((u32Pin) ^= 1)

void GPIO_SetMode(GPIO_T *gpio, uint32_t u32PinMask, uint32_t u32Mode);
void GPIO_EnableInt(GPIO_T *gpio, uint32_t u32Pin, uint32_t u32IntType, uint32_t u32IntPol);
void GPIO_DisableInt(GPIO_T *gpio, uint32_t u32Pin);
void GPIO_Pad_Mode(uint32_t u32Pin, uint8_t u8Mode);
void Pin_Resistor_Ctrl(PIN_CTRL_T *pin_ctrl, uint32_t u32RE, uint32_t u32UE);
void Pin_Pull_Up(PIN_CTRL_T *pin_ctrl, uint8_t u8PinNum);
void Pin_Pull_Down(PIN_CTRL_T *pin_ctrl, uint8_t u8PinNum);
void Pin_Open_Drain(PIN_CTRL_T *pin_ctrl, uint8_t u8PinNum);

#ifdef __cplusplus
}
#endif

#endif // __GPIO_H__














